在前面的文章中,咱們咱們已經會了如何將聲音傳送給對方,而接下來這篇文章咱們就要來學習
收到了聲音已後,要如何的播出呢 ?
咱們收到聲音以後(檔案或串流) 那接下來要如何播出了 ?
答案就是使用播放器
,而接下來我們就要來介紹大部份播放器的內核ffmpeg
。
基本上本篇分成以下的章節來理解 ffmpeg 這好用的東東:
它就是可以幫咱們進行一些影音的奇技淫巧 (ex. 解碼、編碼、轉碼、抽取、串流)
FFmpeg (Fast Forward MPEG) 它是一個開源的影音多媒體的火藥庫,有了它我們可以很簡單的將前面幾個章節中提到的採集、編碼、封裝內容給串連起來。
它最核心的應用是當播放器的核心。
前面的章節有提到,我們將一段聲音從麥克風採集下來後,先經過編碼將它縮小,然後在封裝成一個容器,最後在透過網路傳輸協議,將它丟到對方的電腦後,接下要如何處理呢 ?
對方電腦的處理過程如下圖,它會先解析容器,然後進行解碼,最後在輸出聲音到對方的耳機或啥的。
其中處理解析容器與協定,然後再進行解碼的就是咱們電腦中所使用的播放器,像是 KMPlayer、千千靜聽、QuickTime Player,而有不少的播放器裡面都是以 ffmpeg 為內核,像是 KMPlayer 與 QQ 影音。
當然 ffmpeg 還有很多的使用功能,下面簡單的列幾個例子:
總而言之,它就是個影音軍火庫。
它事實上是一系列的工具,基本上是由以下幾個組合而成。
這東東基本上就是用於轉碼用的工具。
例如下面官網上的範例,它就是將 input.avi 檔案強制轉成 fps 為 24 的 output.avi 。
ffmpeg -i input.avi -r 24 output.avi
fps
指的是一段畫面,每秒鐘有幾張畫面,以上面的範例 24 就代表這部影像每秒鐘
由 24 張圖片組成。
這個就是可以用來直接播放某部影片或串流的工具。
Ex. 播放 rtmp 串流
ffplay rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4
Ex. 播放 .mp4 檔案
ffplay big_buck_bunny.mp4
它是一個用來串流或檔案內容的工具。
Ex. 查看 rtmp 串流
ffprobe rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4
從下圖的 metadata 可以知道這個 rtmp 串流的相關資訊,包含這部片的長度、fps、聲音編碼與影像編碼。
下面我們來學一下它的一些簡單的範例,這些都會在後面的實作章節中會需要傳用到。
在這裡我們會先將聲音存放到 .mp4 檔案,然後在將這個檔案以 rtmp 的方式,推送到 Server 。
ffmpeg -re -i big_buck_bunny.mp4 -c copy -f flv rtmp://localhost/live/test
簡單的說明一下上面這段指令的意思:
-re : 這個是只有在模擬本機採機設備才需要參數 ( 因為我們是用檔案來模擬採集 )
-i : 後面跟者輸入的檔案。
big_buck_bunny.mp4:模擬直播主畫面的檔案。
-c : 選擇 decoder 與 encoder,但這裡我們不用選所以使用 copy。
-f : 強制轉換成指定的格式,像上面我們就將它轉成 flv。
rtmp://localhost/live/test:要推送到的目的。
由於現在很多的傳輸媒體都限制需要使用 h.264 與 AAC 的編碼,所以需要進行轉。下面的範例我們會將 .wav 檔轉成 aac 與 h264 的 test.mp4 檔。
ffmpeg -i test.wav -c:a aac -ar 44100 -c:v libx264 -preset superfast -tune zerolatency -f mp4 test.mp4
-i : 後面跟者輸入的檔案。
-c:a aac -ar 44100 : 將聲音轉成成 aac 編碼,並且頻率為 44100。
-c:v libx264 -preset superfast -tune zerolatency : 將它轉成 h.264 影像編碼,然後面用 tune 類型。
執行完以後可以使用以下指令,來查看有沒有轉好。
ffprobe test.mp4
內容如下,聲音與影像已經轉成了 aac 與 h.264
事實上就是非常簡單的使用 ffplay。
ffplay rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4
本篇文章咱們簡單的學習了一些 ffmpeg 的相關知識與應用,在接下來的實作文章中,咱們會很常的使用到它。
這篇文章結束以後,基本上完整的將聲音傳送到遠方的某個人耳裡,基本理論方面大概都學習完了,接下來的章節就開始進行一些實作,並且在往一些更進階的東西前進囉。